#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=1e6+3;
int n,m,L,V;
int xd[N],xv[N],xa[N];
int b[N],c[N],g[N],sum;
int Case=1;
void work(int x,int y){
	int l=lower_bound(b+1,b+m+1,x)-b;
	int r=lower_bound(c+1,c+m+1,-y)-c;r=m-r+1;
	if(l>r) return;
	sum++;
	g[l]=min(g[l],r);
}
int Main()
{
	sum=0;
	scanf("%d%d%d%d",&n,&m,&L,&V);
	for(int i=1;i<=n;i++) scanf("%d%d%d",&xd[i],&xv[i],&xa[i]);
	for(int i=1;i<=m;i++) scanf("%d",&b[i]),g[i]=m+1;
	for(int i=1;i<=m;i++) c[i]=-b[m-i+1];
	for(int i=1;i<=n;i++){
		int d=xd[i],v=xv[i],a=xa[i];
		if(a==0){
			if(v>V){
				work(d,L);
			}
		}
		if(a>0){
			if(v>V){
				work(d,L);
			}
			else{
				double t=1.0*(V-v)/a;
				double x=t*(v+V)/2;
				x+=d;
				if(x>L) x=L;
				int z=x+1;
				work(z,L);
			}
		}
		if(a<0){
			if(v>V){
				double t=1.0*(V-v)/a;
				double x=t*(v+V)/2;
				x+=d;
				if(x>L) x=L;
				int z=x;
				if(V*V-v*v==2*a*(z-d)) work(d,z-1);
				else work(d,z);
			}
 		}
	}
	/*puts("");
	for(int i=1;i<=n;i++) printf("%d ",g[i]);
	puts("");*/
	int R=m+1,mst=0;
	for(int i=1;i<=m;i++){
		R=min(R,g[i]);
		if(R==i) R=m+1,mst++;
	}
	printf("%d %d\n",sum,m-mst);
	return 0;
}
int main()
{
	freopen("detect.in","r",stdin);
	freopen("detect.out","w",stdout);
    Case=1;
    scanf("%d",&Case);
    while(Case--) Main();
	return 0;
}
